package core

import (
	"context"
	"geekai/core/store"
	"geekai/core/types"
	"github.com/go-redis/redis/v8"
	"go.uber.org/fx"
	"gorm.io/gorm"
	"os"
)

type ConfigParams struct {
	ConfigFile string
	Debug      bool
}

// RegisterAppServerObj 注册web服务
func RegisterAppServerObj() fx.Option {
	return fx.Module("app_server",
		fx.Provide(NewServer),
		fx.Invoke(func(configParams ConfigParams, s *AppServer, client *redis.Client) {
			s.Init(configParams.Debug, client)
		}),
	)
}

// RegisterConfigObj 注册配置对象
func RegisterConfigObj() fx.Option {
	return fx.Module("app_config",
		fx.Provide(func(configParams ConfigParams) *types.AppConfig {
			// 加载配置
			config, err := LoadConfig(configParams.ConfigFile)
			if err != nil {
				log.Fatal("加载配置文件出错：", err)
			}
			config.Path = configParams.ConfigFile
			if configParams.Debug {
				_ = SaveConfig(config)
			}
			return config
		}),
	)
}

// RegisterStoreObj 注册 Store
func RegisterStoreObj() fx.Option {
	return fx.Module("store",
		fx.Provide(store.NewRedisClient),
		fx.Provide(store.NewGormConfig),
		fx.Provide(store.NewMysql),
	)
}

// RegisterAppLifecycleObj 注册程序生命周期
func RegisterAppLifecycleObj() fx.Option {
	return fx.Module("app_lifecycle",
		fx.Provide(NewAppLifecycle),
		// 启动应用服务
		fx.Invoke(func(s *AppServer, db *gorm.DB) {
			go func() {
				err := s.Run(db)
				if err != nil {
					log.Errorf("应用服务出现异常：%v", err)
					os.Exit(0)
				}
			}()
		}),
		// 注册生命周期函数
		fx.Invoke(func(lifecycle fx.Lifecycle, lc *AppLifecycle) {
			lifecycle.Append(fx.Hook{
				OnStart: func(ctx context.Context) error {
					return lc.OnStart(ctx)
				},
				OnStop: func(ctx context.Context) error {
					return lc.OnStop(ctx)
				},
			})
		}),
	)
}
